package expression;

import util.Result;
import util.Scope;
import util.Type;
import exception.ExpressionException;

/**
 * Klasa reprezentujaca szeroko pojete wyrazenie
 * 
 * @author Jakub Fibinger
 *
 */
public abstract class Expression {
	/**
	 * Wynik obliczonego wyrazenie
	 */
	protected Result result;
	/**
	 * Zakres zmiennych do jakiego ma dostep dane wyrazenie
	 */
	protected Scope scope;

	/**
	 * Metoda obliczajaca dane wyrazenie
	 * 
	 * @return Wynik obliczonego wyrazenie w postaci obiektu klasy Result
	 * @see Result
	 * @throws ExpressionException
	 */
	public abstract Result evaluate() throws ExpressionException;

	/**
	 * Metoda zwracajaca typ calego wyrazenie (wykorzystywana do kontroli poprawnosci typow)
	 * 
	 * @return Typ wyniku obliczonego wyrazenie 
	 * @throws ExpressionException
	 */
	public Type getResultType() throws ExpressionException {
		if(result==null) {
			throw new ExpressionException();
		}
		return result.getType();
	}
}
